<?php
class Gestor_Modulos_Kakoon_Model extends CI_Model
{
	public function __construct()
	{
		parent::__construct();
	}

	public function instalaModulo (Archivo $archivo)
	{
		$retorno = false;

		$fichero     = $archivo->getRutaCompleta();
		$zip         = new ZipArchive();
		$abierto     = $zip->open($fichero);

		if ($abierto)
		{
			$zip->extractTo($GLOBALS["FORMULARIO_TMP_UPLOAD"]);
			$zip->close();
		}

		$DS            = DIRECTORY_SEPARATOR;
		$directorio    = str_replace (".zip", "", $archivo->getNombreArchivo());
		$meta          = $GLOBALS["FORMULARIO_TMP_UPLOAD"] . $directorio . $DS . "META-INF";
		$items         = file ($meta);
		$nombre        = null;
		$base          = null;
		$descripcion   = null;
		$inicioUrl     = null;
		$inicio        = ConstantesKakoon::NO;
		$menu          = array();

		foreach ($items as $unItem)
		{
			list ($clave, $valor) = explode (":", $unItem);

			$clave = trim ($clave);
			$valor = trim ($valor);

			if ($clave == "nombre")
			{
				$nombre = $valor;
			}

			if ($clave == "base")
			{
				$base = $valor;
			}

			if ($clave == "descripcion")
			{
				$descripcion = $valor;
			}

			if ($clave == "inicio_url")
			{
				$inicioUrl = $valor;
			}

			if ($clave == "inicio" && ($valor == ConstantesKakoon::SI || $valor == ConstantesKakoon::NO) )
			{
				$inicio = $valor;
			}

			if ($clave == "menu")
			{
				list ($descripcionMenu, $urlMenu) = explode(",", $valor);

				$menu[$descripcionMenu] = $urlMenu;
			}
		}

		$mismoBase        = ($directorio == $base);
		$hayNombre        = (Soporte::contieneValor($nombre));
		$hayBase          = (Soporte::contieneValor($base));
		$hayDescripcion   = (Soporte::contieneValor($descripcion));
		$hayInicio        = ($inicio == ConstantesKakoon::SI || $inicio == ConstantesKakoon::NO);
		$hayInicioUrl     = (Soporte::contieneValor($inicioUrl));
		$hayMenu          = (count($menu) > 0);
		$crearModulo      = ($hayNombre && $hayDescripcion && $hayMenu && $hayInicio && $hayInicioUrl && $mismoBase);
		$movidoHelper     = false;
		$movidoController = false;
		$movidoVistas     = false;

		if ($crearModulo)
		{
			$baseHelper       = $GLOBALS["FORMULARIO_TMP_UPLOAD"] . $directorio . $DS . "helpers". $DS;
			$baseController   = $GLOBALS["FORMULARIO_TMP_UPLOAD"] . $directorio . $DS . "controllers". $DS;
			$baseVistas       = $GLOBALS["FORMULARIO_TMP_UPLOAD"] . $directorio . $DS . "views". $DS;

			$origenHelper       = $baseHelper . $directorio;
			$destinoHelper      = dirname(__FILE__) . $DS ."..". $DS . "helpers". $DS . $directorio;

			$origenController     = $baseController . "administracion". $DS;
			$origenControllerWeb  = $baseController . "web". $DS;
			$destinoController    = dirname(__FILE__) . $DS ."..". $DS . "controllers". $DS . "administracion". $DS;
			$destinoControllerWeb = dirname(__FILE__) . $DS ."..". $DS . "controllers". $DS;

			$origenVistas       = $baseVistas . "administracion". $DS .$directorio;
			$origenVistasWeb    = $baseVistas . "web". $DS .$directorio;
			$destinoVistas      = dirname(__FILE__) . $DS ."..". $DS . "views". $DS . "administracion". $DS .$directorio;
			$destinoVistasWeb   = dirname(__FILE__) . $DS ."..". $DS . "views". $DS . $directorio;

			$movidoHelper         = rename ($origenHelper, $destinoHelper);
			$movidoVistas         = rename ($origenVistas, $destinoVistas);
			$movidoVistasWeb      = rename ($origenVistasWeb, $destinoVistasWeb);

			$administracion   = Soporte::leeDirectorio($baseController."administracion");
			$web              = Soporte::leeDirectorio($baseController."web");

			foreach ($administracion as $fichero => $nulo)
			{
				copy($baseController."administracion".$DS.$fichero, $destinoController.$fichero);
			}

			foreach ($web as $fichero => $nulo)
			{
				copy($baseController."web".$DS.$fichero, $destinoControllerWeb.$fichero);
			}
		}

		if ($movidoHelper && $movidoVistas && $movidoVistasWeb)
		{
			$this->borraDirectorio ($GLOBALS["FORMULARIO_TMP_UPLOAD"] . $directorio);
			unlink($GLOBALS["FORMULARIO_TMP_UPLOAD"] . $directorio .".zip");

			$sql = "DELETE FROM ". ModuloKakoon::TABLA ." WHERE descripcion='". $descripcion ."'";
			getAccesoBD()->query($sql);

			$instancia = new ModuloKakoon(getAccesoBD());
			$instancia->setPropiedad ("nombre",       $nombre);
			$instancia->setPropiedad ("base",         $base);
			$instancia->setPropiedad ("descripcion",  $descripcion);
			$instancia->setPropiedad ("activo",       ConstantesKakoon::SI);
			$instancia->setPropiedad ("url",          site_url($inicioUrl));
			$instancia->consolida();

			$publico = new MenuPublicoKakoon(getAccesoBD());
			$publico->setPropiedad ("titulo",       $nombre);
			$publico->setPropiedad ("url",          site_url($inicioUrl));
			$publico->setPropiedad ("posicion",     1);
			$publico->setPropiedad ("inicio",       $inicio);
			$publico->registraPosicion();
			$publico->consolida();
			
			if ($publico->esInicio())
			{
			    $modelo = new ModeloMenuPublicoKakoon(getAccesoBD());
			    $modelo->setPaginaInicio($publico->getIdentificador());
			}

			foreach ($menu as $titulo => $url)
			{
				$itemMenu = new MenuModuloKakoon(getAccesoBD());
				$itemMenu->setPropiedad (ModuloKakoon::CLAVE_PRIMARIA, $instancia->getIdentificador());
				$itemMenu->setPropiedad ("titulo", $titulo);
				$itemMenu->setPropiedad ("url",    site_url($url));
				$itemMenu->consolida();
			}

			$objetos = Soporte::leeDirectorio($destinoHelper);
			$clases  = array();

			foreach ($objetos as $clase => $extension)
			{
				if ($extension != "php")
				{
					continue;
				}
				
				$clase = str_replace (".php", "", $clase);

				if (preg_match("/.+helper$/", $clase))
				{
					include ($destinoHelper . $DS . $clase .".php");
					continue;
				}

				array_push($clases, $clase);
			}
			
			foreach ($clases as $clase)
			{
				$objeto = new $clase (getAccesoBD());

				if ($objeto instanceof Datos)
				{
					$objeto->borraTabla();
					$objeto->creaTabla();
				}
			}

			$retorno = true;
		}

		return $retorno;
	}

	public function purgaModulo (ModuloKakoon $modulo)
	{
		$nombre           = $modulo->getPropiedad("base");
		$DS               = DIRECTORY_SEPARATOR;
		$controladores    = Soporte::leeDirectorio(dirname(__FILE__).$DS."..".$DS."controllers".$DS."administracion".$DS);
		$controladoresWeb = Soporte::leeDirectorio(dirname(__FILE__).$DS."..".$DS."controllers".$DS);
		$helper           = dirname(__FILE__).$DS."..".$DS."helpers".$DS.$nombre;
		$vistas           = dirname(__FILE__).$DS."..".$DS."views".$DS."administracion".$DS.$nombre;
		$vistasWeb        = dirname(__FILE__).$DS."..".$DS."views".$DS.$nombre;
		$objetos          = Soporte::leeDirectorio($helper);
		$clases           = array();

		foreach ($controladores as $fichero => $nulo)
		{
			if (preg_match("/^". $nombre."/", $fichero))
			{
				$ruta = dirname(__FILE__).$DS."..".$DS."controllers".$DS."administracion".$DS.$fichero;

				unlink ($ruta);
			}
		}

		foreach ($controladoresWeb as $fichero => $nulo)
		{
			if (preg_match("/^". $nombre."/", $fichero))
			{
				$ruta = dirname(__FILE__).$DS."..".$DS."controllers".$DS.$fichero;

				unlink ($ruta);
			}
		}

		foreach ($objetos as $fichero => $extension)
		{
			if ($extension != "php")
			{
				continue;
			}
			
			if (preg_match("/^". $nombre.".+helper.php/", $fichero))
			{
				include ($helper . $DS . $fichero);
				continue;
			}

			$clase = str_replace (".php", "", $fichero);
			array_push ($clases, $clase);
		}

		foreach ($clases as $clase)
		{
			$instancia = new $clase (getAccesoBD());

			if ($instancia instanceof Datos)
			{
				$instancia->borraTabla();
			}
				
			$instancia = null;
		}

		$this->borraDirectorio($helper);
		$this->borraDirectorio($vistas);
		$this->borraDirectorio($vistasWeb);
		
		$modelo = new ModeloModuloKakoon(getAccesoBD());
		$modelo->purga($modulo);
	}

	public function borraDirectorio ($dirname)
	{
		if (is_dir($dirname))
		{
			$dir_handle = opendir($dirname);
		}

		if (!$dir_handle)
		{
			return false;
		}

		while($file = readdir($dir_handle))
		{
			if ($file != "." && $file != "..")
			{
				if (!is_dir($dirname."/".$file))
				{
					unlink($dirname."/".$file);
				} else {
					$this->borraDirectorio($dirname.'/'.$file);
				}
			}
		}

		closedir($dir_handle);
		rmdir($dirname);

		return true;
	}
}
?>